#ifndef SQ_LIST_H
#define SQ_LIST_H

#include "simple.h"

enum
{
	SQ_LIST_CAPA = 1024 ,
};

struct sq_list
{
	elem_t data[SQ_LIST_CAPA];
	size_t len;
};
typedef struct sq_list sq_list;

#define sq_list_len(l) (l->len)

sq_list * sq_list_create();
void sq_list_release(sq_list * l);
int sq_list_empty(const sq_list * l);
void sq_list_clear(sq_list * l);
int sq_list_append(sq_list * l, const elem_t * ep, size_t len);

#define sq_list_set(l, ep, len) (sq_list_clear(l), sq_list_append(l, ep, len))

#define sq_list_clone(l) \
	({sq_list * m = sq_list_create(); sq_list_append(m, l->data, l->len); m;})

void sq_list_display(const sq_list * l);

int sq_list_get(const sq_list * l, index_t i, elem_t * e);
index_t sq_list_locate(const sq_list * l, elem_t e);

int sq_list_insert(sq_list * l, index_t i, elem_t e);
int sq_list_delete(sq_list * l, index_t i, elem_t * e);

/*
 * @return
 * 	count of elements deleted in range [min, max]
 */
int sq_list_delete_range(sq_list * l, elem_t min, elem_t max);
int sq_list_delete_range2(sq_list * l, elem_t min, elem_t max);

void sq_list_rotate(sq_list * l);
void sq_list_rotate2(sq_list * l);

#endif /* SQ_LIST_H */

